package com.sf.manager.impl;

import java.util.List;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.sf.manager.CollectInfoManager;
import com.sf.manager.CollectMemberManager;
import com.sf.manager.RegInfoManager;
import com.sf.mapper.RegInfoMapper;
import com.sf.model.CollectInfo;
import com.sf.model.CollectMember;
import com.sf.model.CollectStatus;
import com.sf.model.RegInfo;
import com.sf.model.RegInfoExample;
import com.sf.util.MarathonConst;

/**
 * 报名信息Manager实现类
 *
 * @author 604625
*/
@Component
public class RegInfoManagerImpl implements RegInfoManager {

	@Autowired
	private RegInfoMapper regInfoMapper;
	@Autowired
	private CollectInfoManager collectInfoManager;
	@Autowired
	private CollectMemberManager collectMemberManager;
	
	/**
	 * 按条件计数
	 * 
	 * @param example 条件
	 * 
	 * @return int 记录总数
	 *
    */
	@Override
    public int countByExample(RegInfoExample example){
		return regInfoMapper.countByExample(example);
	}

	/**
	 * 按条件删除
	 * 
	 * @param example 条件
	 * 
	 * @return int 成功条数  
	 *
    */
	@Override
    public int deleteByExample(RegInfoExample example){
		return regInfoMapper.deleteByExample(example);
	}
	
	/**
	 * 按主键删除
	 * 
	 * @param id 
	 * 
	 * @return int 成功条数  
	 *
    */
	@Override
    public int deleteByPrimaryKey(Integer id){
		return regInfoMapper.deleteByPrimaryKey(id);
	}

	/**
	 * 新增
	 * 
	 * @param record 记录
	 * 
	 * @return int 成功条数  
	 *
    */
	@Override
	@Transactional
    public int insert(RegInfo record){
		// 判断当前集货团是否已经到达人数上限
		Integer cid = Integer.parseInt(record.getUserdef1());
		String openId = record.getOpenid();
		
		CollectInfo collectInfo = collectInfoManager.selectByPrimaryKey(cid);
		if(collectInfo == null){
			throw new IllegalStateException("集货团信息不存在,id:"+cid);
		}
		
		int needNum = collectInfo.getNeedNum();// 组团需要人数
		int curNum = collectInfo.getCurNum();// 当前人数
		
		if(curNum+1 == needNum){// 人数达到上限则重新开团
			CollectInfo newCollectInfo = new CollectInfo();
			BeanUtils.copyProperties(collectInfo, newCollectInfo);
			newCollectInfo.setCreateEmp(MarathonConst.CREATE_EMP);
			collectInfoManager.insert(newCollectInfo);
			
			collectInfo.setStatus(CollectStatus.FINISHED.getCode());// 已完成
		}
		
		collectInfo.setCurNum(curNum+1);// 当前人数+1
		collectInfoManager.updateByPrimaryKey(collectInfo);
		
		CollectMember collecMember = new CollectMember();
		collecMember.setCid(cid);
		collecMember.setOpenid(openId);
		collectMemberManager.insert(collecMember);
		
		record.setMid(collecMember.getId());
	    return regInfoMapper.insert(record);
	}
	
	/**
	 * 新增,null字段不插入
	 * 
	 * @param record 记录
	 * 
	 * @return int 成功条数  
	 *
    */
	@Override
    public int insertSelective(RegInfo record){
		return regInfoMapper.insertSelective(record);
	}
	
	
	/**
	 * 按条件查询
	 * 
	 * @param example 条件
	 * 
	 * @return List<RegInfo> 记录列表
	 *
    */
	@Override
    public List<RegInfo> selectByExample(RegInfoExample example){
		return regInfoMapper.selectByExample(example);
	}

	/**
	 * 按主键查询
	 * 
	 * @param id 
	 * 
	 * @return RegInfo 记录 
	 *
    */
	@Override
    public RegInfo selectByPrimaryKey(Integer id){
		return regInfoMapper.selectByPrimaryKey(id);
	}

	/**
	 * 按条件更新,null字段不更新
	 * 
	 * @param record 记录
	 * @param example 条件
	 * @return int 成功条数  
	 *
    */
	@Override
    public int updateByExampleSelective(RegInfo record, RegInfoExample example){
		return regInfoMapper.updateByExampleSelective(record, example);
	}

	
	/**
	 * 按条件更新
	 * 
	 * @param record 记录
	 * @param example 条件
	 * @return int 成功条数  
	 *
    */
	@Override
    public int updateByExample(RegInfo record,  RegInfoExample example){
		return regInfoMapper.updateByExample(record, example);
	}

	/**
	 * 按主键更新,null的字段不更新
	 * 
	 * @param record 记录
	 * @return int 成功条数 
	 *
    */
    public int updateByPrimaryKeySelective(RegInfo record){
		return regInfoMapper.updateByPrimaryKeySelective(record);
	}


	/**
	 * 按主键更新
	 * 
	 * @param record 记录
	 * @return int 成功条数 
	 *
    */
	@Override
    public int updateByPrimaryKey(RegInfo record){
		return regInfoMapper.updateByPrimaryKey(record);
	}
	
}